iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 18

Codewars Ruby Challenge - Day 18/30

  • 分享至 

  • xImage
  •  

學習

  1. 複習大到小的排序方法:如正向小到大是用 .sort,如果是反向則是 .sort.reverse
  2. 練習 Guard Clauses 的寫法:昨天剛好助教 DC 傳授功夫,學到這種寫法取代一般 if / else 的 Nested Conditionals(巢狀) 寫法。看完幾篇文章,目前認知好處有兩個 (1) 程式碼行數減少 (2) 看程式碼是一行一行,而不用一大包(尤其是 if 內又有 if 又有 if 時,Nested Conditionals 的寫法就會看得非常辛苦)。以下用這次題目來比較這兩種寫法

Nested Conditionals(巢狀) 寫法

def is_sorted_and_how(arr)
  asc = arr.sort
  des = arr.sort.reverse
  
  if (arr != asc) && (arr != des)
    'no'
  else
    if (arr == asc)
      'yes, ascending'
    else
      'yes, descending'
    end
  end
end

Guard Clauses 的寫法(警衛這個詞很貼切,警衛在門口,不合規定就帶走)

def is_sorted_and_how(arr)
  asc = arr.sort
  des = arr.sort.reverse
  return 'no' if (arr != asc) && (arr != des)
  return 'yes, ascending' if (arr == asc)
  'yes, descending'
end

Guard Clause 參考文章:

  1. 中文好讀版:http://teddy-chen-tw.blogspot.com/2012/05/implementation-patterns-guard-clause.html
  2. 看英文更精確:https://anthonygharvey.com/ruby/guard_clauses_vs_nested_if_statements

題目:

# 檢查是否有照順序排?

def is_sorted_and_how(arr)
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "檢查是否有照順序排?" do
    expect(is_sorted_and_how([1, 2])).to eq 'yes, ascending'
    expect(is_sorted_and_how([15, 7, 3, -8])).to eq 'yes, descending'
    expect(is_sorted_and_how([4, 2, 30])).to eq 'no'
  end
end

我的答案

def is_sorted_and_how(arr)
  asc = arr.sort
  des = arr.sort.reverse
  return 'no' if (arr != asc) && (arr != des)
  return 'yes, ascending' if (arr == asc)
  'yes, descending'
end

思路:

  1. 以結果來看有三種答案「沒有排序」「小到大排序」「大到小排序」
  2. 先把輸入的 arr 直接做出「小到大」與「大到小」
  3. 然後開始用 if 來判斷到底屬於哪一種(今天的 if 判斷式特別用昨天學到的 guard clause 寫)

龍哥建議的答案

def is_sorted_and_how(arr)
  case arr
  when arr.sort
    'yes, ascending'
  when arr.sort.reverse
    'yes, descending'
  else
    'no'
  end
end

上一篇
Codewars Ruby Challenge - Day 17/30
下一篇
Codewars Ruby Challenge - Day 19/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言